<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>15.函数与方法中this的不同</title>
</head>

<body>
  <script>
    // 属于类属性的函数就被叫做方法，不属于类属性的函数就是函数...有点绕

    // 函数调用（也就是不存在于类中的函数）
    // 全局环境下this就是 window 对象的引用
    console.log(this == window); //true

    // 使用严格模式时在全局函数内this为undefined

    //var hd = '后盾人';
    //function get () {
    //"use strict"
    //return this.hd;
    //}
    //console.log(get()); //严格模式将产生错误 Cannot read property 'name' of undefined


    // 方法调用 （对象里面的元素定义为函数我们称为方法）

    // 函数为对象的方法时this 指向该对象

    // 可以使用多种方式创建对象，下面是使用构造函数创建对象

    //构造函数主要用来生成对象，里面的 this 默认就是指当前对象
    function User () {
      this.name = "后盾人";
      this.say = function () {
        console.log(this); //User {name: "后盾人", say: ƒ}
        return this.name;
      };
    }
    let hd = new User();
    console.log(hd.say()); //后盾人

    // 对象字面量
    // - 下例中的 hd 函数不属于对象方法所以指向window
    // - show 属于对象方法执向 obj对象
    let obj = {
      site: "后盾人",
      show () {
        console.log(this.site); //后盾人
        console.log(`this in show method: ${this}`); //this in show method: [object Object]
        function hd () {
          console.log(typeof this.site); //undefined
          console.log(`this in hd function: ${this}`); //this in hd function: [object Window]
        }
        hd();
      }
    };
    obj.show();


  </script>

</body>

</html>